#!/bin/bash

# DevOps平台部署脚本
# 使用方法: ./deploy.sh [dev|prod]

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Docker
    if ! command -v docker &> /dev/null; then
        log_error "Docker未安装，请先安装Docker"
        exit 1
    fi
    
    # 检查Docker Compose
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose未安装，请先安装Docker Compose"
        exit 1
    fi
    
    # 检查Node.js（用于前端构建）
    if ! command -v node &> /dev/null; then
        log_warning "Node.js未安装，将使用Docker构建前端"
    fi
    
    # 检查Python（用于后端开发）
    if ! command -v python3 &> /dev/null; then
        log_warning "Python3未安装，将使用Docker运行后端"
    fi
    
    log_success "依赖检查完成"
}

# 环境设置
setup_environment() {
    local env=$1
    log_info "设置${env}环境..."
    
    # 创建环境变量文件
    if [ "$env" = "prod" ]; then
        if [ ! -f "devops-backend/.env" ]; then
            log_info "创建生产环境配置文件..."
            cp devops-backend/.env.example devops-backend/.env
            log_warning "请编辑 devops-backend/.env 文件，设置生产环境配置"
        fi
    else
        log_info "使用开发环境默认配置"
    fi
    
    # 创建必要的目录
    mkdir -p devops-backend/logs
    mkdir -p nginx/ssl
    
    log_success "环境设置完成"
}

# 构建镜像
build_images() {
    log_info "构建Docker镜像..."
    
    # 构建后端镜像
    log_info "构建后端镜像..."
    docker build -t devops-backend:latest ./devops-backend
    
    # 构建前端镜像
    log_info "构建前端镜像..."
    docker build -t devops-frontend:latest ./devops-frontend
    
    log_success "镜像构建完成"
}

# 数据库迁移
migrate_database() {
    log_info "执行数据库迁移..."
    
    # 等待数据库服务启动
    sleep 10
    
    # 执行迁移
    docker-compose exec backend python manage.py migrate
    
    # 创建超级用户（如果不存在）
    docker-compose exec backend python manage.py shell -c "
from django.contrib.auth import get_user_model
User = get_user_model()
if not User.objects.filter(username='admin').exists():
    User.objects.create_superuser('admin', 'admin@devops.com', 'admin123')
    print('超级用户创建成功')
else:
    print('超级用户已存在')
"
    
    # 初始化数据
    docker-compose exec backend python init_data.py
    
    log_success "数据库迁移完成"
}

# 启动服务
start_services() {
    local env=$1
    log_info "启动${env}环境服务..."
    
    if [ "$env" = "prod" ]; then
        # 生产环境
        docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    else
        # 开发环境
        docker-compose up -d
    fi
    
    log_success "服务启动完成"
}

# 健康检查
health_check() {
    log_info "执行健康检查..."
    
    # 等待服务启动
    sleep 30
    
    # 检查后端健康状态
    if curl -f http://localhost:8000/api/common/health/ > /dev/null 2>&1; then
        log_success "后端服务健康"
    else
        log_error "后端服务异常"
        return 1
    fi
    
    # 检查前端服务
    if curl -f http://localhost:8080/health > /dev/null 2>&1; then
        log_success "前端服务健康"
    else
        log_error "前端服务异常"
        return 1
    fi
    
    log_success "健康检查通过"
}

# 显示服务状态
show_status() {
    log_info "服务状态:"
    docker-compose ps
    
    echo ""
    log_info "访问地址:"
    echo "前端: http://localhost:8080"
    echo "后端API: http://localhost:8000/api/"
    echo "API文档: http://localhost:8000/api/docs/"
    echo "管理后台: http://localhost:8000/admin/"
    echo ""
    echo "默认管理员账号:"
    echo "用户名: admin"
    echo "密码: admin123"
}

# 停止服务
stop_services() {
    log_info "停止服务..."
    docker-compose down
    log_success "服务已停止"
}

# 清理资源
cleanup() {
    log_info "清理Docker资源..."
    docker-compose down -v --remove-orphans
    docker system prune -f
    log_success "清理完成"
}

# 主函数
main() {
    local command=${1:-"dev"}
    
    case $command in
        "dev")
            log_info "开始部署开发环境..."
            check_dependencies
            setup_environment "dev"
            build_images
            start_services "dev"
            migrate_database
            health_check
            show_status
            ;;
        "prod")
            log_info "开始部署生产环境..."
            check_dependencies
            setup_environment "prod"
            build_images
            start_services "prod"
            migrate_database
            health_check
            show_status
            ;;
        "stop")
            stop_services
            ;;
        "clean")
            cleanup
            ;;
        "status")
            show_status
            ;;
        *)
            echo "使用方法: $0 [dev|prod|stop|clean|status]"
            echo "  dev    - 部署开发环境"
            echo "  prod   - 部署生产环境"
            echo "  stop   - 停止服务"
            echo "  clean  - 清理资源"
            echo "  status - 显示状态"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
